package com.hmdp.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import com.hmdp.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 拦截器，同请求进行拦截，看是否已经登录
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 这里不能使用@autowire等自动注入，为什么呢？
     * 因为LoginInterceptor在MvcConfig配置的时候是我们自己new的，而不是spring
     * 容器帮我们自动创建的，自然spring容器不能帮我们注入
     */
    StringRedisTemplate stringRedisTemplate;



    public LoginInterceptor(StringRedisTemplate stringRedisTemplate){
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        Object userDTO = request.getSession().getAttribute("userDTO");
        String token = request.getHeader("authorization");  //前端对token取的名字是authorization
        if (token == null) {
            response.setStatus(401);   //401 未授权 属于http协议里的内容.很多时候可以利用这些特性，浏览器可以对于显示响应的页面
            log.info("未授权");
            return false;
        }
        Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(token);
        if (userMap.isEmpty()){
            log.info("未授权");
            response.setStatus(401);
            return false;
        }
        UserDTO userDTO = BeanUtil.mapToBean(userMap, UserDTO.class, true, CopyOptions.create());
        //在拦截器中，获取用户信息，存储到ThreadLocal中，方便后续可能使用到
        UserHolder.saveUser((UserDTO) userDTO);

        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //移除，视频中说防止内存泄漏（但其实不太理解）
        UserHolder.removeUser();
    }
}
